package 栈;

import java.util.Stack;

/**
 * @author 陈艺博
 * @date 2021-02-20 21:49
 * @description https://leetcode-cn.com/problems/score-of-parentheses/
 **/
public class _856_score_of_parentheses_括号的分数 {
    public static void main(String[] args) {
        System.out.println(scoreOfParentheses1("(()())"));
    }

    //栈方法
    static public int scoreOfParentheses(String s) {
        Stack<Character> stack = new Stack<>();
        char[] c = s.toCharArray();
        int sum = 0;
        boolean flag = true;
        for (int i = 0; i < c.length; i++) {
            if (c[i] == '(') {//获取右括号，添加到栈中
                stack.add(c[i]);
                flag = true;
            } else {
                if (flag) {//存在未使用过的右括号，则2^(stack.size-1)累加
                    sum += Math.pow(2, stack.size() - 1);
                    stack.pop();
                    flag = false;
                } else {//将已经计算过的括号出栈
                    stack.pop();
                }
            }
        }
        return sum;
    }

    //统计核心的数目
    static public int scoreOfParentheses1(String s) {
        int answer = 0;// 答案
        int depth = 0;// 深度
        for (int i = 0; i < s.length(); ++i) {//便利字符串
            if (s.charAt(i) == '(') {//存在右括号则深度 +1
                depth++;
            } else {
                depth--;
                if (s.charAt(i - 1) == '(') {
//                    answer += Math.pow(2,depth);
                    answer += 1 << depth;
                }
            }
        }

        return answer;
    }

    /**
     * ----------------------性能测试-------------------------------------------
     * 方法              运行时间    消耗内存
     * 栈方法             1 ms	   36.3 MB
     * 统计核心数-Math     0 ms	   36.7 MB
     * 统计核心数-位移     0 ms	   36.5 MB
     */
}
